home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 7: Sunsite
/
Linux Cubed Series 7 - Sunsite Vol 1.iso
/
system
/
news
/
readers
/
skim-0.8
/
skim-0
/
skim-0.8.4
/
ConstructArticle.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-02-18
|
7KB
|
281 lines
/*
* NAME
* ConstructArticle.c
* USAGE
* Usage: ConstructArticle ArticleFile
* DESCRIPTION
* This program gets information from the caller and from the environment.
* It uses the constructors of the Article class to construct an article.
* The article is saved in a file.
*
* See also 'skim replyto' and 'skim newarticle'. Don't run this program
* directly.
* COPYRIGHT
* Skim - Off-line news reading package optimized for slow lines.
* Copyright (C) 1996 Rene W.J. Pijlman
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* VERSION
* Skim version 0.8.4.
*/
#include <assert.h>
#include "Skim.h"
#include "SkimUtils.h"
#include "VarBuf.h"
#include "StandardIO.h"
#include "Article.h"
FILE_ID("$Header#");
static VarBuf CreateReplyToArticleVB( VarBuf OriginalFileContent )
{
VarBuf New = NULL;
VarBuf Signature = NULL;
VarBuf X_NewsReader = NULL;
VarBuf From = NULL;
VarBuf Path = NULL;
VarBuf ReplyTo = NULL;
VarBuf Organization = NULL;
VarBuf ErrorMessages = NULL;
Article Reply = NULL;
Boolean Success = True;
Article Original = ArticleCreate();
ArticleSetVB( Original, OriginalFileContent );
if ( ArticleIsOKAndComplete( Original ) )
{
ItemsFromEnvironment( &Signature, &X_NewsReader, &From, &ReplyTo,
&Path, &Organization );
Reply = ArticleConstructReply( Original, From, Path, ReplyTo,
Organization, Signature, X_NewsReader );
assert( ArticleIsOKAndComplete(Reply) );
New = ArticleGetVB( Reply );
}
else
{
Success = False;
SIOPrintf( StandardError, "Error: %V",
ArticleGetErrorMessages(Original) );
}
ArticleDestroy( Original );
ArticleDestroy( Reply );
VBDestroy(Signature);
VBDestroy(X_NewsReader);
VBDestroy(From);
VBDestroy(Path);
VBDestroy(ReplyTo);
VBDestroy(Organization);
VBDestroy(ErrorMessages);
if ( !Success )
{
VBDestroy( New );
New = NULL;
}
return New;
}
static Boolean CreateReplyToArticleFile(
const char * OriginalFileName,
const char * ReplyFileName )
{
StandardIO OriginalFile = SIOCreate();
VarBuf OriginalFileContent = VBCreate();
VarBuf ReplyFileContent = NULL;
StandardIO ReplyFile = SIOCreate();
Boolean Success = True;
if ( SIOFileExists( ReplyFileName ) )
{
Success = False;
SIOPrintf( StandardError, "Error: File %s already exists\n",
ReplyFileName );
}
if ( Success )
{
SIOFileOpen( OriginalFile, OriginalFileName, OpenModeRead );
SIOFileOpen( ReplyFile, ReplyFileName, OpenModeWrite );
VBReadFile( OriginalFileContent, OriginalFile );
ReplyFileContent = CreateReplyToArticleVB( OriginalFileContent );
if ( ReplyFileContent != NULL )
{
VBWriteFile( ReplyFileContent, ReplyFile );
}
}
VBDestroy( OriginalFileContent );
SIODestroy( OriginalFile );
VBDestroy( ReplyFileContent );
SIODestroy( ReplyFile );
return Success;
}
static Boolean CreateNewArticleFile(
const char * FileName,
const char * NewsGroupsAsString,
const char * SubjectAsString )
{
StandardIO NewArticle = SIOCreate();
VarBuf NewArticleFileName = VBCreate();
Boolean Success = True;
VarBuf Signature = NULL;
VarBuf X_NewsReader = NULL;
VarBuf From = NULL;
VarBuf Path = NULL;
VarBuf ReplyTo = NULL;
VarBuf Organization = NULL;
VarBuf NewsGroups = VBCreate();
VarBuf Subject = VBCreate();
VBPrintf( NewsGroups, "%s", NewsGroupsAsString );
VBPrintf( Subject, "%s", SubjectAsString );
VBPrintf( NewArticleFileName, "%s/Post/%s",
SkimDirectory(), FileName );
if ( !SIOFileExists( VBAsString(NewArticleFileName) ) )
{
StandardIO NewArticleFile = SIOCreate();
VarBuf NewArticleVB = NULL;
Article NewArticle = NULL;
SIOFileOpen( NewArticleFile, VBAsString(NewArticleFileName),
OpenModeWrite );
ItemsFromEnvironment( &Signature, &X_NewsReader, &From, &ReplyTo,
&Path, &Organization );
NewArticle = ArticleConstructNew( NewsGroups, Subject, From, Path,
ReplyTo, Organization, Signature,
X_NewsReader );
NewArticleVB = ArticleGetVB( NewArticle );
if ( NewArticleVB != NULL )
{
VBWriteFile( NewArticleVB, NewArticleFile );
}
SIODestroy( NewArticleFile );
VBDestroy( NewArticleVB );
ArticleDestroy( NewArticle );
}
else
{
SIOPrintf( StandardError, "Error: File %s already exists\n",
FileName );
Success = False;
}
VBDestroy( NewArticleFileName );
SIODestroy( NewArticle );
VBDestroy(Subject);
VBDestroy(Signature);
VBDestroy(X_NewsReader);
VBDestroy(From);
VBDestroy(Path);
VBDestroy(ReplyTo);
VBDestroy(Organization);
VBDestroy( NewsGroups );
return Success;
}
#define USAGE "Usage:\n" \
"\tConstructArticle new Filename NewsGroups Subject\n" \
"\tConstructArticle reply ArticleFilename ...\n"
int main( int argc, char **argv )
{
Boolean Success = True;
int i;
if ( !getenv("IAmSkim") )
{
SIOPrintf( StandardError, "%s\n",
"You appear to be running %s directly. Use 'skim replyto' instead.",
argv[0] );
exit( EXIT_FAILURE );
}
if ( !getenv("SKIMFROM") )
{
SIOPrintf( StandardError, "%s\n",
"Environment variable SKIMFROM is not set" );
exit( EXIT_FAILURE );
}
if ( argc > 2 && !strcmp( argv[1], "reply" ) )
{
for ( i = 2; Success && i < argc; i++ )
{
if ( strlen(argv[i]) > 0 )
{
VarBuf OriginalFileName = VBCreate();
VarBuf ReplyFileName = VBCreate();
VBPrintf( OriginalFileName, "%s/Articles/%s",
SkimDirectory(), argv[i] );
VBPrintf( ReplyFileName, "%s/Post/%s.reply",
SkimDirectory(), argv[i] );
Success = CreateReplyToArticleFile(
VBAsString(OriginalFileName),
VBAsString(ReplyFileName) );
VBDestroy(OriginalFileName);
VBDestroy(ReplyFileName);
}
}
}
else if ( argc > 4 && !strcmp( argv[1], "new" ) )
{
if ( strlen(argv[2]) > 0 && strlen(argv[3]) > 0 && strlen(argv[4]) > 0 )
{
Success = CreateNewArticleFile( argv[2], argv[3], argv[4] );
}
else
{
SIOPrintf( StandardError, "%s\n", USAGE );
exit( EXIT_FAILURE );
}
}
else
{
SIOPrintf( StandardError, "%s\n", USAGE );
exit( EXIT_FAILURE );
}
return Success ? EXIT_SUCCESS : EXIT_FAILURE;
}